/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Asignaciones;


import java.util.*;
import Entidades.*;
import Controladores.CatedraticoJpaController;
import Entidades.Catedratico;
import Entidades.Horariocatedratico;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;


/**
 *  
 * 
 * Date 18/6/2013 11:35 am
 * @author Isaac Cifuentes <isaaccivan@gmail.com>
 * @author Jorge Quijivix <j.or.alq@gmail.com>
 * @version 0.1
 * Branch Equipo_B
 *
 */
public class Asignacion {

 /**Summary: Se deben realizar las validaciones necesarias
 * 
 *ToDo:Se deben crear los metodos
 */ 
    
    /**
     * Date: 17:32 25/06/2013
     * Branch: Equipo_B
     * Obtiene el horario verificado por un catedratico
     * @author T4r0_o Estuardo Diaz <esjoando555@gmail.com>
     * @param catedratico El catedratico de quien deseamos obtener su
     * horario verificado
     * @return El horario que ya se ha verificado del catedratico       * 
     * @since 0.1
     */
    public static Collection getVerifiedSchedule(Catedratico catedratico)
    {
        Collection<Horariocatedratico> horariosVerificados = catedratico.getHorariocatedraticoCollection();
        horariosVerificados = getVerifiedSchedule(catedratico);
        return horariosVerificados;
    }
    
    
    /**
     * Date: 17:35 25/06/2013
     * Branch: Equipo_B
     * Limpia del horario, los registros que no cumplen con la bandera
     * @author T4r0_o Estuardo Diaz <esjoando555@gmail.com>
     * @param schedule El horario que se desea limpiar
     * @param flag La condición con la que se eliminará un horario
     * @return una Collection limpia.
     */
    static Collection filterSchedule(Collection<Horariocatedratico> schedule, boolean  flag)
    {
        Collection<Horariocatedratico> nuevosHorarios = new ArrayList<Horariocatedratico>();
        for(Horariocatedratico horario : schedule)
        {
            if(horario.getAnulado() != flag)
            {
                nuevosHorarios.add(horario);
            }
        }
        return nuevosHorarios;
    }  
    /***
     * Branch: Equipo_B 
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * Metodo para obtener los Asignacionperiodocatedratico correspondientes
     * a un dia
     * @param dia
     * @return un Collection<Asignacionperiodocatedratico>
     */
    public Collection obtenerAsignacionPeriodoCatedraticos(Horariocatedratico dia){
    Collection<Asignacionperiodocatedratico> todos = dia.getAsignacionperiodocatedraticoCollection();
    Collection<Asignacionperiodocatedratico> resultado=new ArrayList<Asignacionperiodocatedratico>();
    for( Asignacionperiodocatedratico buscador: todos){
    resultado.add(buscador);
    }
    return resultado;
    }
    /***
     * Branch: Equipo_B 
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * Metodo para obtener los Asignacionperiodocatedratico correspondientes
     * a un dia
     * @param dia
     * @param si es disponible o no
     * @return Collection<Asignacionperiodocatedratico>
     */
     public Collection obtenerAsignacionPeriodoCatedraticos(Horariocatedratico dia, boolean disponible){
    Collection<Asignacionperiodocatedratico> todos = dia.getAsignacionperiodocatedraticoCollection();
    Collection<Asignacionperiodocatedratico> resultado=new ArrayList<Asignacionperiodocatedratico>();
    for( Asignacionperiodocatedratico buscador: todos){
    if(buscador.getDisponible().booleanValue()==disponible)    
    resultado.add(buscador);
    }
    return resultado;
    }
     /***
      *  Branch: Equipo_B 
      * @author Isaac Cifuentes <isaaccivan@gmail.com>
      *Metodo para obtener todos los controles de un catedratico 
      * @param el  periodo para el que se buscan los controles
      * @return  Collection AdministrarControlCatedraticos
      */
     public Collection AdministrarControlCatedraticos(Asignacionperiodocatedratico periodo){
    Collection<Controlcatedraticos> todos = periodo.getControlcatedraticosCollection();
    Collection<Controlcatedraticos> resultado=new ArrayList<Controlcatedraticos>();
    for( Controlcatedraticos buscador: todos){  
    resultado.add(buscador);
    }
    return resultado;
     }
    
     /***
      *  Branch: Equipo_B 
      * @author Isaac Cifuentes <isaaccivan@gmail.com>
      *  Metodo para obtener todos los controles de un catedratico 
      * @param el  periodo para el que se buscan los controles
      * @param el estado por el que se desea filtrar 
      * @return  Collection AdministrarControlCatedraticos
      */
     public Collection AdministrarControlCatedraticos(Asignacionperiodocatedratico periodo, Estado estado){
    Collection<Controlcatedraticos> todos = periodo.getControlcatedraticosCollection();
    Collection<Controlcatedraticos> resultado=new ArrayList<Controlcatedraticos>();
    for( Controlcatedraticos buscador: todos){  
        if(buscador.getEstadoidEstado().getIdEstado()==estado.getIdEstado())
    resultado.add(buscador);
    }
    return resultado;
     }

 /***********************************************************/
   EntityManagerFactory emf = Persistence.createEntityManagerFactory("CaleneerProjectPU");
     EntityManager em = emf.createEntityManager();//objteto
     Query consulta;//consulta que se realizara 
     /***
     * Este metodo tiene por objetivo buscar y devolver los
     * horarios correspondientes
     * al catedratico enviado
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * @param catedratico
     * @return List<horario> una lista con los registros de    
     * correspondientes al catedratico enviado
     */   
    public List<horario> obtenerHorarioConfirmadoCatedratico(Catedratico catedratico){
    List<horario> horario= new ArrayList<horario>();//nuestra lista de horarios
     horario dia=new horario(em);//un dia 
     try{
     consulta=em.createQuery("Select p, from Horariocatedratio where p.Catedratico_idCatedratico=:"+catedratico.getNumeroCatedratico().toString()+"and p.anulado=false");
     /**
      * en la consulta hecha en parte de arriba se buscan los registros
      * en la tabla Horariocatedratio que coincidan con el id del catedratico
      * ingresado y que no esten anulados
      * esto es basicamente obtener los dias que el catedratico tiene disponibles
      * estos dias son guardados en listadedias
      */
     List<Horariocatedratico> listadedias=consulta.getResultList();
          for(Horariocatedratico h: listadedias){
    /*se recorre la lista y para cada dia se buscan los registros Asiganacionperidocatedratico y los peridos
    *de eso se encarga el objeto dia 
    * se ingresa el dia actual e indicamos que queremos los registros cuyo valor disponible sea true*/
     dia.ingresar(h,true);
     horario.add(dia);//agregamos el dia al horario
          }
     }catch(NullPointerException e){}
          return horario;
    }
    
    public void imprimirmihorario(){
        CatedraticoJpaController r=new CatedraticoJpaController(emf);
      Catedratico cat=  r.findCatedratico(1);
    List<horario> semana=obtenerHorarioConfirmadoCatedratico(cat);
    String impresor="";
    for(horario e:semana){
     impresor+=e.verHorario();
    }
        System.out.println(impresor);
    }
 //**************************************************************************
   /**
     * *
     * Date: 8/6/2013
     * Branch: Equipo_B 
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * Metodo para buscar todos dias de aulas
     * @param aula
     * @return un   Collection<Horarioaula>
     */
    public  Collection BuscarDias(Aula aula){
  
        Collection<Horarioaula> dias= aula.getHorarioaulaCollection();
       Collection<Horarioaula> resultado=new ArrayList<Horarioaula>() ;
         for(Horarioaula  buscador: dias ){
               resultado.add(buscador);
    }
    return resultado;
}
    /**
     * *
     * Date: 30/6/2013
     * Branch: Equipo_B 
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * Metodo para buscar dias de aulas
     * @param aula
     * @param estado si se quieren las que fueron anuladas o no
     * @return un ArrayList<Horarioaula>
     */

  public  Collection BuscarDias(Aula aula, boolean estado){
  
        Collection<Horarioaula> dias= aula.getHorarioaulaCollection();
       Collection<Horarioaula> resultado=new ArrayList<Horarioaula>() ;
         for(Horarioaula  buscador: dias ){
        if(buscador.getAnulado()==estado)
            resultado.add(buscador);
    }
    return resultado;
}
    /**
     * **
     * Date: 30/6/2013 Branch: Equipo_B
     *
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * @param el dia
     * @param el estado del periodo
     * @return Collection con HorariAsignacionPeriodoAulaoaula
     */
    public Collection BuscarPeridodeldia(Horarioaula dia, boolean estado ){
        Collection<Asignacionperiodoaula> periodos= dia.getAsignacionperiodoaulaCollection();
    Collection<Asignacionperiodoaula> resultado=new ArrayList<Asignacionperiodoaula>() ;
    for(Asignacionperiodoaula  buscador: periodos ){
        if(buscador.getDisponible().booleanValue()==estado){
                  resultado.add(buscador);}
    }
    return resultado;
    }  
     /**
     * **
     * Date: 6/7/2013 Branch: Equipo_B
     *Metodo para obtener los registros sin importar si estan disponibles o no
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * @param el dia
     * @return Collection con HorariAsignacionPeriodoAulaoaula
     */
    public Collection BuscarPeridodeldia(Horarioaula dia){
       Collection<Asignacionperiodoaula> periodos= dia.getAsignacionperiodoaulaCollection();
    Collection<Asignacionperiodoaula> resultado=new ArrayList<Asignacionperiodoaula>() ;
    for(Asignacionperiodoaula  buscador: periodos ){
              resultado.add(buscador);
    }
    return resultado;
    }
    /**
     * *
     * Date: 30/6/2013 Branch: Equipo_B
     * @author Isaac Cifuentes <isaaccivan@gmail.com>
     * @param periodo
     * @return Collection con TODOS los controles del aula
     */
    public Collection AdministrarControlAulas(Asignacionperiodoaula periodo){
     Collection<Controlaulas> periodos= periodo.getControlaulasCollection();
    Collection<Controlaulas> resultado=new ArrayList<Controlaulas>() ;
    for(Controlaulas  buscador: periodos ){
              resultado.add(buscador);
    }
    return resultado;
    }
  /****
   * Buscamos los controles de aula que se encuentren en un estado especifico
   * @param el peridodo periodo
   * @param estado el estado que deseamos
   * @return  Collection de Controlaulas
   */  
      public Collection AdministrarControlAulas(Asignacionperiodoaula periodo, Estado estado){
       Collection<Controlaulas> control=AdministrarControlAulas(periodo);
    Collection<Controlaulas> resultado=new ArrayList<Controlaulas>() ;
  
       for(Controlaulas buscar: control){
           if(buscar.getEstadoidEstado().getIdEstado()==estado.getIdEstado())
                resultado.add(buscar);
       }        
       return resultado;
    }
}